meson: Use feature options for media and print backends
authorXavier Claessens <xavier.claessens@collabora.com>
Sat, 17 Oct 2020 13:50:40 +0000 (09:50 -0400)
committerXavier Claessens <xavier.claessens@collabora.com>
Sat, 17 Oct 2020 13:54:47 +0000 (09:54 -0400)
This gracefully disable ffmpeg, gstreamer, cups and cloudprint optional
dependencies when they are not available, while still giving full
control to distributors using -Dauto_features=enabled.

meson_options.txt
modules/media/meson.build
modules/printbackends/meson.build

index ac50721ff80033a4cf77c2858a482d3556702d5d..24a61511d75632d11fa762947678bb3247bf36ea 100644 (file)
@@ -27,17 +27,27 @@ option('macos-backend',
 
 # Media backends
 
-option('media',
-       type: 'string',
-       value: 'gstreamer',
-       description : 'Build the specified media engines (comma-separated list, "all", or "none")')
+option('media-ffmpeg',
+       type: 'feature',
+       value: 'auto',
+       description : 'Build the ffmpeg media backend')
+
+option('media-gstreamer',
+       type: 'feature',
+       value: 'auto',
+       description : 'Build the gstreamer media backend')
 
 # Print backends
 
-option('print',
-       type: 'string',
-       value: 'cups,file',
-       description : 'Build the specified print backends (comma-separated list, "all", or "none")')
+option('print-cups',
+       type: 'feature',
+       value: 'auto',
+       description : 'Build the cups print backend')
+
+option('print-cloudprint',
+       type: 'feature',
+       value: 'auto',
+       description : 'Build the cloudprint print backend')
 
 # Optional features
 
index 59124d315476c1c0930f26736afa22153465f02c..79df9c7769d7e3f4562d84c1237599b878744c6c 100644 (file)
@@ -1,27 +1,6 @@
-all_media_backends = [
-  'ffmpeg',
-  'gstreamer'
-]
-
-enabled_media_backends = get_option('media').split(',')
-
-if enabled_media_backends.contains('none')
-  media_backends = []
-elif enabled_media_backends.contains('all')
-  media_backends = all_media_backends
-else
-  media_backends = []
-  foreach b: enabled_media_backends
-    if all_media_backends.contains(b)
-      media_backends += b
-    else
-      error('No media backend named "@0@" exists.'.format (b))
-    endif
-  endforeach
-endif
-
 media_subdir = 'gtk-4.0/@0@/media'.format(gtk_binary_version)
 media_install_dir = join_paths(get_option('libdir'), media_subdir)
+media_backends = []
 
 extra_c_args = [
   '-DGTK_COMPILATION',
@@ -30,15 +9,28 @@ extra_c_args = [
 
 extra_c_args += common_cflags
 
-if media_backends.contains('ffmpeg')
-  libavfilter_dep = dependency('libavfilter', version: '>= 6.47.100', required: true)
-  libavformat_dep = dependency('libavformat', version: '>= 57.41.100', required: true)
-  libavcodec_dep = dependency('libavcodec', version: '>= 57.48.101', required: true)
-  libavutil_dep = dependency('libavutil', version: '>= 55.28.100', required: true)
-  libswscale_dep = dependency('libswscale', version: '>= 4.6.100', required: true)
-  ffmpeg_deps = [libavfilter_dep, libavformat_dep, libavcodec_dep, libavutil_dep, libswscale_dep]
+ffmpeg_opt = get_option('media-ffmpeg')
+ffmpeg_versions = {
+  'libavfilter': '>= 6.47.100',
+  'libavformat': '>= 57.41.100',
+  'libavcodec': '>= 57.48.101',
+  'libavutil': '>= 55.28.100',
+  'libswscale': '>= 4.6.100',
+}
+ffmpeg_deps = []
+ffmpeg_found = true
+foreach name, version : ffmpeg_versions
+  dep = dependency(name, version: version, required: ffmpeg_opt)
+  ffmpeg_deps += dep
+  if not dep.found()
+    ffmpeg_found = false
+    break
+  endif
+endforeach
+
+if ffmpeg_found
+  media_backends += 'ffmpeg'
   cdata.set('HAVE_FFMPEG', 1)
-
   shared_module('media-ffmpeg',
                 'gtkffmediafile.c',
                 c_args: extra_c_args,
@@ -47,10 +39,11 @@ if media_backends.contains('ffmpeg')
                 install : true)
 endif
 
-if media_backends.contains('gstreamer')
-  gstplayer_dep = dependency('gstreamer-player-1.0', version: '>= 1.12.3', required: true)
+gstplayer_dep = dependency('gstreamer-player-1.0', version: '>= 1.12.3',
+                           required: get_option('media-gstreamer'))
+if gstplayer_dep.found()
+  media_backends += 'gstreamer'
   cdata.set('HAVE_GSTREAMER', 1)
-
   shared_module('media-gstreamer',
                 'gtkgstmediafile.c',
                 'gtkgstpaintable.c',
index 1cde1734932f605f13efdfa282e439558e302be2..b60fdb202f152dae5ddf1afb911c44827122a153 100644 (file)
@@ -1,35 +1,4 @@
-all_print_backends = [
-  'cups',
-  'cloudprint',
-]
-
-enabled_print_backends = get_option('print').split(',')
-
-if enabled_print_backends.contains('none')
-  enabled_print_backends = []
-elif enabled_print_backends.contains('all')
-  enabled_print_backends = all_print_backends
-endif
-
-# The 'file' print backend cannot be disabled
-print_backends = ['file']
-
-# Checks to see if we should compile with CUPS backend for GTK
-enable_cups = enabled_print_backends.contains('cups')
-if enable_cups
-  cups_dep = dependency('cups', version : '>=2.0', required: true)
-  print_backends += ['cups']
-endif
-
-# Checks to see if we should compile with cloudprint backend for GTK
-enable_cloudprint = enabled_print_backends.contains('cloudprint')
-if enable_cloudprint
-  rest_dep = dependency('rest-0.7', required : true)
-  json_glib_dep = dependency('json-glib-1.0', required : true)
-  if rest_dep.found() and json_glib_dep.found()
-    print_backends += ['cloudprint']
-  endif
-endif
+print_backends = []
 
 if not cc.has_header('cairo-pdf.h', dependencies : cairo_dep)
   error('Cannot find cairo-pdf.h. You must build Cairo with the pdf backend enabled.')
@@ -44,11 +13,6 @@ if os_unix
   endif
 endif
 
-# Automatic fall-back to the lpr backend
-if not print_backends.contains('cups')
-  print_backends += ['lpr']
-endif
-
 printbackends_subdir = 'gtk-4.0/@0@/printbackends'.format(gtk_binary_version)
 printbackends_install_dir = join_paths(get_option('libdir'), printbackends_subdir)
 
@@ -61,7 +25,9 @@ printbackends_args = [
   '-D_GLIB_EXTERN=@0@'.format(visibility_define),
 ] + common_cflags
 
-if print_backends.contains('cups')
+cups_dep = dependency('cups', version : '>=2.0', required: get_option('print-cups'))
+if cups_dep.found()
+  print_backends += 'cups'
   shared_module('printbackend-cups',
                 'gtkprintbackendcups.c',
                 'gtkprintercups.c',
@@ -71,9 +37,21 @@ if print_backends.contains('cups')
                 dependencies: [libgtk_dep, cups_dep, colord_dep],
                 install_dir: printbackends_install_dir,
                 install : true)
+else
+  # Automatic fall-back to the lpr backend
+  print_backends += 'lpr'
+  shared_module('printbackend-lpr',
+                'gtkprintbackendlpr.c',
+                c_args: printbackends_args,
+                dependencies: libgtk_dep,
+                install_dir: printbackends_install_dir,
+                install : true)
 endif
 
-if print_backends.contains('cloudprint')
+rest_dep = dependency('rest-0.7', required : get_option('print-cloudprint'))
+json_glib_dep = dependency('json-glib-1.0', required : get_option('print-cloudprint'))
+if rest_dep.found() and json_glib_dep.found()
+  print_backends += ['cloudprint']
   shared_module('printbackend-cloudprint',
                 'gtkprintbackendcloudprint.c',
                 'gtkprintercloudprint.c',
@@ -84,20 +62,11 @@ if print_backends.contains('cloudprint')
                 install : true)
 endif
 
-if print_backends.contains('file')
-  shared_module('printbackend-file',
-                'gtkprintbackendfile.c',
-                c_args: printbackends_args,
-                dependencies: libgtk_dep,
-                install_dir: printbackends_install_dir,
-                install : true)
-endif
-
-if print_backends.contains('lpr')
-  shared_module('printbackend-lpr',
-                'gtkprintbackendlpr.c',
-                c_args: printbackends_args,
-                dependencies: libgtk_dep,
-                install_dir: printbackends_install_dir,
-                install : true)
-endif
+# The 'file' print backend cannot be disabled
+print_backends += 'file'
+shared_module('printbackend-file',
+              'gtkprintbackendfile.c',
+              c_args: printbackends_args,
+              dependencies: libgtk_dep,
+              install_dir: printbackends_install_dir,
+              install : true)